﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOSKIT_XOS_CORE_XOS_STL_SRC_MEM_POOL_AUTO_LIST_H__
#define __XOSKIT_XOS_CORE_XOS_STL_SRC_MEM_POOL_AUTO_LIST_H__

#include "fake_lock.h"
#include <list>

namespace xos_stl
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // 
    // 

    template< class T, class ListLock = fake_lock >
    class auto_list : public std::list< T* >
    {
    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
		typedef ListLock LIST_LOCK;
		typedef auto_list< T, LIST_LOCK > LIST;
		typedef typename LIST::const_iterator CONST_ITER;
		typedef typename LIST::iterator ITER;
        typedef std::list< T* > BASE;
	protected:
		LIST_LOCK _xos_stl_auto_list_lock;
    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
		auto_list() : BASE()
		{
		}
		~auto_list()
		{
			put_back_to_pool( true );
		}
	public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
		void put_back_to_pool( bool bLock )
		{
			if( bLock )
			{
				lock();
			}
			for( ITER iter = BASE::begin(); iter != BASE::end(); )
			{
				T * pT = *iter++;
				pT->release();
				pT = 0;
			}
            BASE::clear();
			if( bLock )
			{
				un_lock();
			}
		}
		void un_lock()
		{
			_xos_stl_auto_list_lock.un_lock();
		}
		void lock()
		{
			_xos_stl_auto_list_lock.lock();
		}
    };

} // xos_stl

#endif // __XOSKIT_XOS_CORE_XOS_STL_SRC_MEM_POOL_AUTO_LIST_H__
